import globalConfig from '@/common/config';
import http from '@/uview-ui/libs/request';
import { encryptPassword, uuid } from '@/common/utils';
// 传参去除空格
import myMixin from '@/common/myMixin.js';
// #ifndef MP-WEIXIN
// import { Sentry } from '@/common/sentry';
// #endif

let isInPreservePage = false;

function doSign(params) {
  const ans = [];
  const paramsArr = Object.entries(params);
  for (const [k, v] of paramsArr) String(v) && ans.push(`${k}=${v}`);
  params.sign = paramsStrSort(ans.sort().join('&'));
}

// 新签名md5(key+timestamp)
function newSign(params) {
  params.sign = encryptPassword(params.timestamp, 'SKService').toUpperCase();
}

function paramsStrSort(paramsStr) {
  const memberSecret = uni.getStorageSync('memberSecretV2');
  const secret = memberSecret ? 'SKService' + memberSecret : '';
  const urlStr = encodeURIComponent(paramsStr + secret);
  return encryptPassword(urlStr, '').toLocaleUpperCase();
}

function getRequestHerder() {
  // #ifdef MP-WEIXIN || APP-PLUS
  return {
    clientplatform: globalConfig.clientplatform,
    clientversion: globalConfig.clientversion,
  };
  // #endif
}

const header = getRequestHerder() || {};

http.setConfig({
  // baseUrl: '', // 请求的本域名
  // method: 'GET',
  method: 'POST',
  dataType: 'json', // 设置为json，返回后会对数据进行一次JSON.parse()
  showLoading: false, // 是否显示请求中的loading
  loadingText: '努力加载中...', // 请求loading中的文字提示
  loadingTime: 800, // 在此时间内，请求还没回来的话，就显示加载中动画，单位ms
  originalData: true, // 是否在拦截器中返回服务端的原始数据
  loadingMask: true, // 展示loading的时候，是否给一个透明的蒙层，防止触摸穿透
  // 配置请求头信息
  header: {
    // 'Content-Type': 'application/x-www-form-urlencoded',
    'content-type': 'application/json;charset=UTF-8',
    ...header,
  },
});

// 请求拦截，配置Token等参数
http.interceptor.request = async (config) => {
  const { needMemberId, ...configData } = config.data;
  let data = {
    // appId: globalConfig.appId,
    version: globalConfig.clientversion,
    // 随机生成uuid
    // random: uuid(),
    ...configData,
  };
  // 当前时间
  data.timestamp = data&&data.timestamp ? data.timestamp : Date.now();

  // 传参去除空格
  if(myMixin&&myMixin.methods.isEmptyNew()&&data){
    if(!myMixin.methods.isEmptyNew(data)){
      //Object.entries(): 返回一个对象自身的（不含继承的）所有可遍历（enumerable）属性的键值对的数组
      let arr = Object.entries(data)
      arr.forEach((item,index )=>{
        if(myMixin.methods.emptyString(item[1])){
          //替换空格
          // item[1] = item[1].replace(/\s*/g, "")
          //替换空格
          item[1] = item[1].replace(/^\s+|\s+$/g, "")
        }
      })
      //Object.fromEntries(): 将一个键值对数组转为对象
      data = {...Object.fromEntries(arr)}
    }
  }

  // const member = uni.getStorageSync('member');
  // if (needMemberId && member) data.memberId = data.memberId || member.id;
  // 签名
  // doSign(data);
  // 新签名
  newSign(data);
  config.data = data;
  if(config.url&&config.data&&config.data.sign){
    config.url = config.url+'?sign='+config.data.sign
  }
  return config;
  // 如果return一个false值，则会取消本次请求
};

// 响应拦截，判断状态码是否通过
http.interceptor.response = (res) => {
  if(res&&res.data){
    const { underMaintenance } = res.data || {};
    if (!isInPreservePage && underMaintenance === 'true') {
      isInPreservePage = true;
      // uni.reLaunch({
      //   url: '/pages/index/updating',
      // });
    }
  }
  // const { data, xhr: optionXHR, statusCode, errMsg } = res || {};

  // const { data } = res || {};
  // // #ifndef APP-NVUE
  // if (data) {
  //   // const { now, timestamp } = data;
  //   const now = data.now || data.timestamp;
  //   if (now) {
  //     // uni.setStorage({ key: 'systemNow', data: now });
  //     Vue.prototype.$store.commit('setSystemNow', now - 0);
  //   }
  // }
  // // #endif

  // #ifndef MP-WEIXIN
  // Sentry.addBreadcrumb({
  //   category: 'xhr',
  //   data: {
  //     method: optionXHR.method,
  //     url: optionXHR.url,
  //     status_code: statusCode,
  //   },
  //   timestamp: new Date() / 1000,
  // });
  //
  // if (data) {
  //   const { status, code } = data;
  //   if ([0, '0', 500].includes(status) || code === 500) {
  //     Sentry.configureScope((scope) => {
  //       scope.setExtra('params', { ...optionXHR.data });
  //       scope.setExtra('response', { ...data });
  //     });
  //     Sentry.captureMessage('response warn', 'warning');
  //   }
  // } else if (errMsg == 'request:fail') {
  //   Sentry.captureMessage('api error', 'error');
  // }
  // #endif
  // 如果返回false，则会调用Promise的reject回调，
  return res;
};

export default http;
